﻿using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using Newtonsoft.Json.Serialization;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Text;
using WeChatSDK.WeChatDto.Conversation.BaseSupport;

namespace WeChatSDK.Common
{
    /// <summary>
    /// 微信通用信息
    /// </summary>
    public static class WeChatGeneral
    {
        public static Dictionary<string, string> ErrorMessage = InitErrMessage();
        public delegate void TokenChangedEventDelegate(WeChatAccessTokenDto weChatAccessTokenDto);
        public static event TokenChangedEventDelegate ChangeTokenEvent;
        public delegate void TakeTokenEventDelegate();
        public static event TakeTokenEventDelegate TakeTokenEvent;
        /// <summary>
        /// Json序列化设置
        /// </summary>
        public static readonly JsonSerializerSettings JsonSerializerSettings = new JsonSerializerSettings
        {
            ContractResolver = new DefaultContractResolver { NamingStrategy = new SnakeCaseNamingStrategy { ProcessDictionaryKeys = false } },
            Converters = new List<JsonConverter> {
                new StringEnumConverter { AllowIntegerValues = true },
                new IsoDateTimeConverter { DateTimeStyles = DateTimeStyles.AssumeLocal, DateTimeFormat = "yyyy-MM-dd HH:mm:ss" }
            },
            NullValueHandling = NullValueHandling.Ignore
        };

        /// <summary>
        /// 触发修改AccessToken记录事件
        /// </summary>
        /// <param name="weChatAccessTokenDto">微信AccessToken信息</param>
        public static void OnChangedTokenEvent(WeChatAccessTokenDto weChatAccessTokenDto)
        {
            if (ChangeTokenEvent != null)
            {
                ChangeTokenEvent(weChatAccessTokenDto);
            }
        }
        /// <summary>
        /// 触发获取AccessToken记录事件
        /// </summary>
        public static void OnTakeTokenEvent()
        {
            if (TakeTokenEvent != null)
            {
                TakeTokenEvent();
            }
        }

        private static Dictionary<string, string> InitErrMessage()
        {
            Dictionary<string, string> errorMessage = new Dictionary<string, string>();
            errorMessage.Add("-1", "系统繁忙，此时请开发者稍候再试");
            errorMessage.Add("0", "成功");
            errorMessage.Add("40001", "获取 access_token 时 AppSecret 错误，或者 access_token 无效。请开发者认真比对 AppSecret 的正确性，或查看是否正在为恰当的公众号调用接口");
            errorMessage.Add("40002", "不合法的凭证类型");
            errorMessage.Add("40003", "不合法的 OpenID ，请开发者确认 OpenID （该用户）是否已关注公众号，或是否是其他公众号的 OpenID");
            errorMessage.Add("40004", "不合法的媒体文件类型");
            errorMessage.Add("40005", "不支持的媒体类型");
            errorMessage.Add("40006", "不合法的文件大小");
            errorMessage.Add("40007", "不合法的媒体文件 id");
            errorMessage.Add("40008", "不合法的消息类型");
            errorMessage.Add("40009", "媒体文件长度不合法");
            errorMessage.Add("40010", "不合法的语音文件大小");
            errorMessage.Add("40011", "不合法的视频文件大小");
            errorMessage.Add("40012", "不合法的缩略图文件大小");
            errorMessage.Add("40013", "不合法的 AppID ，请开发者检查 AppID 的正确性，避免异常字符，注意大小写");
            errorMessage.Add("40014", "不合法的 access_token ，请开发者认真比对 access_token 的有效性（如是否过期），或查看是否正在为恰当的公众号调用接口");
            errorMessage.Add("40015", "不合法的菜单类型");
            errorMessage.Add("40016", "不合法的按钮个数");
            errorMessage.Add("40017", "不合法的按钮个数");
            errorMessage.Add("40018", "不合法的按钮名字长度");
            errorMessage.Add("40019", "不合法的按钮 KEY 长度");
            errorMessage.Add("40020", "不合法的按钮 URL 长度");
            errorMessage.Add("40021", "不合法的菜单版本号");
            errorMessage.Add("40022", "不合法的子菜单级数");
            errorMessage.Add("40023", "不合法的子菜单按钮个数");
            errorMessage.Add("40024", "不合法的子菜单按钮类型");
            errorMessage.Add("40025", "不合法的子菜单按钮名字长度");
            errorMessage.Add("40026", "不合法的子菜单按钮 KEY 长度");
            errorMessage.Add("40027", "不合法的子菜单按钮 URL 长度");
            errorMessage.Add("40028", "不合法的自定义菜单使用用户");
            errorMessage.Add("40029", "不合法的 oauth_code");
            errorMessage.Add("40030", "不合法的 refresh_token");
            errorMessage.Add("40031", "不合法的 openid 列表");
            errorMessage.Add("40032", "不合法的 openid 列表长度");
            errorMessage.Add("40033", "不合法的请求字符，不能包含 \\uxxxx 格式的字符");
            errorMessage.Add("40035", "不合法的参数");
            errorMessage.Add("40038", "不合法的请求格式");
            errorMessage.Add("40039", "不合法的 URL 长度");
            errorMessage.Add("40050", "不合法的分组 id");
            errorMessage.Add("40051", "分组名字不合法");
            errorMessage.Add("40060", "删除单篇图文时，指定的 article_idx 不合法");
            errorMessage.Add("40117", "分组名字不合法");
            errorMessage.Add("40118", "media_id 大小不合法");
            errorMessage.Add("40119", "button 类型错误");
            errorMessage.Add("40120", "button 类型错误");
            errorMessage.Add("40121", "不合法的 media_id 类型");
            errorMessage.Add("40132", "微信号不合法");
            errorMessage.Add("40137", "不支持的图片格式");
            errorMessage.Add("40155", "请勿添加其他公众号的主页链接");
            errorMessage.Add("41001", "缺少 access_token 参数");
            //没完，继续

            errorMessage.Add("45009", "没有剩余的调用次数");

            errorMessage.Add("45157", "标签名非法，请注意不能和其他标签重名");
            errorMessage.Add("45158", "标签名长度超过30个字节");
            errorMessage.Add("45159", "非法的标签");

            errorMessage.Add("45056", "创建的标签数过多，请注意不能超过100个");
            errorMessage.Add("45057", "该标签下粉丝数超过10w，不允许直接删除");
            errorMessage.Add("45058", "不能修改0/1/2这三个系统默认保留的标签");
            errorMessage.Add("45059", "有粉丝身上的标签数已经超过限制，即超过20个");
            errorMessage.Add("49003", "传入的openid不属于此AppID");


            errorMessage.Add("65400", "API不可用，即没有开通/升级到新客服功能");
            errorMessage.Add("65401", "无效客服帐号");
            errorMessage.Add("65403", "	客服昵称不合法");
            errorMessage.Add("65404", "客服帐号不合法");
            errorMessage.Add("65405", "帐号数目已达到上限，不能继续添加");
            errorMessage.Add("65406", "已经存在的客服帐号");
            errorMessage.Add("65407", "邀请对象已经是本公众号客服");
            errorMessage.Add("65408", "本公众号已发送邀请给该微信号");
            errorMessage.Add("65409", "无效的微信号");
            errorMessage.Add("65410", "邀请对象绑定公众号客服数量达到上限（目前每个微信号最多可以绑定5个公众号客服帐号）");
            errorMessage.Add("65411", "该帐号已经有一个等待确认的邀请，不能重复邀请");
            errorMessage.Add("65412", "该帐号已经绑定微信号，不能进行邀请");

            errorMessage.Add("88000", "没有留言权限");
            errorMessage.Add("88001", "该图文不存在");
            errorMessage.Add("88002", "文章存在敏感信息");
            errorMessage.Add("88003", "精选评论数已达上限");
            errorMessage.Add("88004", "已被用户删除，无法精选");
            errorMessage.Add("88005", "已经回复过了");
            errorMessage.Add("88007", "回复超过长度限制或为0 ");
            errorMessage.Add("88008", "该评论不存在");
            
            return errorMessage;
        }
    }
}
